package com.zm.oes.mapper;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zm.oes.entity.Student;
import org.apache.ibatis.annotations.*;

@Mapper
public interface StudentMapper {

    /**
     * 使用 @Select 注解标记，表示这是一个查询操作
     * 查询学生表中符合条件的学生信息，条件包括学生姓名、年级、电话、学院、专业和班级，支持模糊查询
     * 方法的参数包括一个分页对象和多个查询条件参数
     * 使用了 concat('%',#{parameter},'%') 的方式将查询条件拼接成模糊查询的格式
     * 返回类型为带分页信息的学生对象列表
     */
    @Select("select * from student where " +
            "studentName like concat('%',#{name},'%') " +
            "and grade like concat('%',#{grade},'%') " +
            "and tel like concat('%',#{tel},'%') " +
            "and major like concat('%',#{major},'%') " +
            "and institute like concat('%',#{institute},'%') " +
            "and clazz like concat('%',#{clazz},'%')")
    IPage<Student> findAll(Page page, @Param("name") String name, @Param("grade") String grade,
                           @Param("tel") String tel,  @Param("institute") String institute,
                           @Param("major")String major, @Param("clazz") String clazz);

    /**
     * 使用 @Select 注解标记，表示这是一个查询操作
     * 根据学生ID查询单个学生的详细信息
     * 方法的参数为学生ID，返回类型为单个学生对象
     */
    @Select("select * from student where studentId = #{studentId}")
    Student findById(Integer studentId);

    /**
     * 使用 @Delete 注解标记，表示这是一个删除操作
     * 根据学生ID删除对应的学生信息
     * 方法的参数为学生ID，返回类型为操作结果的整数，通常用于表示受影响的行数
     */
    @Delete("delete from student where studentId = #{studentId}")
    int deleteById(Integer studentId);

    /**
     * 使用 @Update 注解标记，表示这是一个更新操作
     * 根据学生ID更新学生的各项信息，包括姓名、年级、专业、班级、学院、电话、邮箱、密码、身份证号、性别和角色
     * 方法的参数为一个学生对象，包含了待更新的学生信息
     * 返回类型为操作结果的整数，通常用于表示受影响的行数
     */
    @Update("update student set studentName = #{studentName},grade = #{grade},major = #{major},clazz = #{clazz}," +
            "institute = #{institute},tel = #{tel},email = #{email},pwd = #{pwd},cardId = #{cardId},sex = #{sex},role = #{role} " +
            "where studentId = #{studentId}")
    int update(Student student);

    /**
     * 更新密码
     * @param student
     * @return 受影响的记录条数
     */
    @Update("update student set pwd = #{pwd} where studentId = #{studentId}")
    int updatePwd(Student student);

    /**
     * 使用 @Insert 注解标记，表示这是一个插入操作
     * 使用 @Options 注解设置了生成键的方式，useGeneratedKeys = true 表示使用自动生成的键，keyProperty = "studentId" 表示将生成的键赋值给 studentId 属性
     * 插入一条新的学生记录，包括学生姓名、年级、专业、班级、学院、电话、邮箱、密码、身份证号、性别和角色
     * 方法的参数为一个学生对象，包含了待插入的学生信息
     * 返回类型为操作结果的整数，通常用于表示受影响的行数
     */
    @Options(useGeneratedKeys = true,keyProperty = "studentId")
    @Insert("insert into student(studentName,grade,major,clazz,institute,tel,email,pwd,cardId,sex,role) values " +
            "(#{studentName},#{grade},#{major},#{clazz},#{institute},#{tel},#{email},#{pwd},#{cardId},#{sex},#{role})")
    int add(Student student);

}
